home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ9310.ZIP / 1993-OCT.ZIP / CAT.ASC < prev    next >
Text File  |  1993-09-17  |  9KB  |  414 lines

  1. _THE C+@ PROGRAMMING LANGUAGE_
  2. by Jim Fleming
  3.  
  4. [LISTING ONE]
  5.  
  6. class Clock {
  7. /* An instance of Clock is a window system application
  8. * displaying an analog clock face with Roman Numerals. */
  9. inherit View view;
  10. /* constants */
  11. const minExtent = (96@112);
  12. const font = Font.new(Rroman.8S);
  13. const iconFont = Font.new(Rbold.12S);
  14. /* instance variables */
  15. BlankView analog;
  16. Bitmap icon;
  17. Integer minuteHand;
  18. Integer hourHand;
  19. Point center;
  20. Point minutePoint;
  21. Point hourPoint;
  22. Rectangle dayRectangle;
  23. Process process;
  24. /* CATEGORY: Creation  -- Create an instance of a Clock application. */
  25. class method (_) new
  26. {
  27.     _ = create;
  28.     Layer.new(_);
  29. }
  30. /* RESTRICTED CATEGORY: Initialization -- Initialize an instance of Clock. This
  31. *  method is required by View paradigm. It links into view hierarchy by using
  32. *  TaViewU as a delegate (of class View). */
  33. method initialize (aView)
  34. {
  35.     Point p;
  36.     Integer ox, oy, cx, cy;
  37.     Integer y;
  38.     Rectangle r;
  39.     view = aView;
  40.     p = view.extent;
  41.     if (p.x < minExtent.x || p.y < minExtent.y) {
  42.         view.topView.initializeFailed(true);
  43.         return;
  44.     }
  45.     /* Create a BlankView */
  46.     ox = 0;
  47.     oy = 0;
  48.     cx = p.x;
  49.     cy = p.y;
  50.     r = Rectangle.origin_corner_(ox@oy, cx@cy);
  51.     analog = BlankView.basicNew;
  52.     thisSelf.newSubView(r, 1, analog);
  53.     thisSelf.init;
  54. }
  55. /* RESTRICTED CATEGORY: Window System Event Handling */
  56. /* Receive a window event. If it is a resize event then adjust our subViews. */
  57. method (_) windowEvent(minor, p)
  58. {
  59.     Integer ox, oy, cx, cy;
  60.     Integer y;
  61.     Rectangle r;
  62.     if (minor @! Event.WINDOW_RESIZE_EVENT) return;
  63.     p = view.extent;
  64.     if (p.x < minExtent.x || p.y < minExtent.y) return;
  65.     _ = thisSelf;
  66.     process.terminate;
  67.     ox = 0;
  68.     oy = 0;
  69.     cx = p.x;
  70.  
  71.    cy = p.y;
  72.     r = Rectangle.origin_corner_(ox@oy, cx@cy);
  73.     analog.adjustSubView(r);
  74.     hourPoint = nil;
  75.     minutePoint = nil;
  76.     thisSelf.init;
  77. }
  78. method deleteLayerExit
  79. {
  80.     process.terminate;
  81. }
  82. /* RESTRICTED CATEGORY: Private -- Initialize an instance of Clock. Draw analog
  83. * clock face and start a surrogate process to update clock time periodically.*/
  84. private init
  85. {
  86.     Point p, q;
  87.     Integer radius, xor, i, j;
  88.     Float sin30, sin60;
  89.     Integer n30, n60;
  90.     Integer charHeight, charWidth;
  91.     /* set up bitmap for clock icon */
  92.     icon = Icon_OL.icon(RClockS, R     R);
  93.     /* set up clock face */
  94.     charHeight = font.charHeight(TAU);
  95.     charWidth = font.charWidth(TAU);
  96.     p = analog.rectangle.extent;
  97.     p.y(p.y - 16);
  98.     dayRectangle = Rectangle.origin_corner_(0@p.y,analog.rectangle.corner);
  99.     if (p.x > p.y)
  100.         radius = (p.y / 2) - 2;
  101.     else
  102.         radius = (p.x / 2) - 2;
  103.     center = (p.x / 2)@(p.y / 2);
  104.     for (i=0; i < 3; i = i + 1)
  105.         analog.circle(center, radius-i, Bitmap.F_STORE);
  106.     sin30 = (Float.fromInteger(30) * Float.radiansPerDegree)
  107.         .sin;
  108.     sin60 = (Float.fromInteger(60) * Float.radiansPerDegree)
  109.         .sin;
  110.     radius = radius - charHeight*2;
  111.     n30 = (sin30 * Float.fromInteger(radius)).asInteger;
  112.     n60 = (sin60 * Float.fromInteger(radius)).asInteger;
  113.     q = (n30@n60) + center;
  114.     thisSelf.centerString(analog, RVS, font, q);
  115.     q = (n60@n30) + center;
  116.     thisSelf.centerString(analog, RIVS, font, q);
  117.     q = (radius@0) + center;
  118.     thisSelf.centerString(analog, RIIIS, font, q);
  119.     q = (n60@(-n30)) + center;
  120.     thisSelf.centerString(analog, RIIS, font, q);
  121.     q = (n30@(-n60)) + center;
  122.     thisSelf.centerString(analog, RIS, font, q);
  123.     q = (0@(-radius)) + center;
  124.     thisSelf.centerString(analog, RXIIS, font, q);
  125.     q = ((-n30)@(-n60)) + center;
  126.     thisSelf.centerString(analog, RXIS, font, q);
  127.     q = ((-n60)@(-n30)) + center;
  128.     thisSelf.centerString(analog, RXS, font, q);
  129.     q = ((-radius)@0) + center;
  130.     thisSelf.centerString(analog, RIXS, font, q);
  131.     q = ((-n60)@n30) + center;
  132.     thisSelf.centerString(analog, RVIIIS, font, q);
  133.     q = ((-n30)@n60) + center;
  134.     thisSelf.centerString(analog, RVIIS, font, q);
  135.     q = (0@radius) + center;
  136.     thisSelf.centerString(analog, RVIS, font, q);
  137.  
  138.     j = radius / 20;
  139.     for (i=1;i<j;i=i+1)
  140.         analog.circle(center, i, Bitmap.F_STORE);
  141.     hourHand = radius / 2;
  142.     minuteHand = radius * 3 / 4;
  143.     /* create clock process */
  144.     process = Process.new(thisSelf);
  145.     process.clockLoop;
  146. }
  147. method centerString (aView, aString, aFont, aPoint)
  148. {
  149.     Integer x,y;
  150.     Point p;
  151.     x = aFont.xOfString(aString);
  152.     y = aFont.yOfString(aString);
  153.     p = aPoint - ((x/2)@(y/2));
  154.     aView.string(aFont, aString, p, Bitmap.F_STORE);
  155. }
  156. method time (hours, minutes)
  157. {
  158.     Integer hq, mq;
  159.     Integer length, x, y;
  160.     Float hrads, mrads;
  161.     String digital;
  162.  
  163.    hours = hours % 12;
  164.     if (hours @= 0)
  165.         digital = R12S;
  166.     else if (hours < 10)
  167.         digital = R %S.sprintf(hours);
  168.     else
  169.         digital = R%S.sprintf(hours);
  170.     if (minutes < 10)
  171.         digital = digital // R:0%S.sprintf(minutes);
  172.     else
  173.         digital = digital // R:%S.sprintf(minutes);
  174.     Icon_OL.newString(digital, icon);
  175.     thisSelf.layer.newIcon(icon);
  176.     if (hours < 3)
  177.         hq = 1;
  178.     else if (hours < 6)
  179.         hq = 2;
  180.     else if (hours < 9)
  181.         hq = 3;
  182.     else
  183.         hq = 4;
  184.     if (minutes < 15)
  185.         mq = 1;
  186.     else if (minutes < 30)
  187.         mq = 2;
  188.     else if (minutes < 45)
  189.         mq = 3;
  190.     else
  191.         mq = 4;
  192.     hours = (hours % 3) * 60 + minutes;
  193.     if (hq @= 2 || hq @= 4) hours = 179 - hours;
  194.     minutes = minutes % 15;
  195.     if (mq @= 2 || mq @= 4) minutes = 14 - minutes;
  196.     hrads = Float.fromInteger(hours/2) * Float.radiansPerDegree;
  197.     mrads = Float.fromInteger(minutes*6) * Float.radiansPerDegree;
  198.     length = Float.fromInteger(hourHand);
  199.     x = (hrads.sin * length).asInteger;
  200.     y = (hrads.cos * length).asInteger;
  201.     if (hq @= 1)
  202.         y = -y;
  203.     else if (hq @= 3)
  204.         x = -x;
  205.     else if (hq @= 4) {
  206.         x = -x;
  207.         y = -y;
  208.     }
  209.     analog.batchOn;
  210.     if (hourPoint @! nil)
  211.         analog.vector(center, hourPoint, Bitmap.F_XOR);
  212.     hourPoint = center+(x@y);
  213.     analog.vector(center, hourPoint, Bitmap.F_XOR);
  214.     length = Float.fromInteger(minuteHand);
  215.     x = (mrads.sin * length).asInteger;
  216.     y = (mrads.cos * length).asInteger;
  217.     if (mq @= 1)
  218.         y = -y;
  219.     else if (mq @= 3)
  220.         x = -x;
  221.     else if (mq @= 4) {
  222.         x = -x;
  223.         y = -y;
  224.     }
  225.     if (minutePoint @! nil)
  226.         analog.vector(center, minutePoint, Bitmap.F_XOR);
  227.     minutePoint = center+(x@y);
  228.     analog.vector(center, minutePoint, Bitmap.F_XOR);
  229.     analog.batchOff;
  230. }
  231. method clockLoop
  232. {
  233.     Date time, lastTime;
  234.     lastTime = Date.now - 3601*24;
  235.     for (;;) {
  236.         if (!view.layer.isAlive) {
  237.             /* Our layer has been deleted */
  238.             Process.running.terminate;
  239.         }
  240.         time = Date.now;
  241.         if (time.minute @! lastTime.minute) {
  242.             thisSelf.time(time.hour, time.minute);
  243.             if (time.dayOfMonth @! lastTime.dayOfMonth) {
  244.                 analog.rectf(dayRectangle, Bitmap.F_CLR);
  245.                 thisSelf.centerString(analog,
  246.                     time.dayOfWeekString[0,3] << R, R <<
  247.                         time.monthString <<
  248.                           R R << time.dayOfMonth.asString,
  249.                     iconFont, dayRectangle.center);
  250.             }
  251.         }
  252.         lastTime = time;
  253.         Timer.sleep(60 - Date.now.second);
  254.     }
  255. }
  256. /* end of class Clock */
  257. }
  258.  
  259.  
  260. Figure 1: 
  261.  
  262. p=12 @ 34;
  263.  
  264. Point
  265. x       12
  266. y       34
  267.  
  268.  
  269. class Point 
  270. {
  271. /* instance variables */
  272. var x; /* x coordinate */
  273. var y; /* y coordinate */
  274.  ... methods of class Point
  275. }
  276.  
  277.  
  278. Figure 2: 
  279.  
  280. p=Rectangle.origin_corner_(12@34,100@200);
  281.  
  282. Rectangle
  283. origin
  284. corner
  285.  
  286. Point
  287. x    12
  288. y    34
  289.  
  290. Point
  291. x   100
  292. y   200
  293.  
  294.  
  295. class Rectangle
  296. {
  297. /* instance variables */
  298. var origin;
  299. var corner;
  300.   ... methods of class Rectangle
  301. }
  302.  
  303.  
  304. Figure 3: 
  305.  
  306. (a)
  307.  
  308. Binary Methods
  309.  
  310. a=b + c;
  311. p=12 @ 34
  312.  
  313. Unary/keyword Methods
  314.  
  315. p=Rectangle.origin_corner_(12@34,100@200);
  316. x=p.origin;
  317.  
  318. (b)
  319.  
  320. Binary Methods 
  321.  
  322. a<=b+c
  323. p<=12@34
  324.  
  325. Keyword Method
  326.  
  327. p<=Rectangle origin: 12@34 corner: 100@200
  328.  
  329. Unary Method
  330.  
  331. x<= p origin
  332.  
  333.  
  334. Figure 4: 
  335.  
  336. (a)
  337.  
  338. if(queue.isEmpty) {
  339.    index=0;
  340. }
  341. else{
  342.    index=queue.next;
  343. }
  344.  
  345.  
  346. (b)
  347.  
  348. queue isEmpty
  349.     ifTrue: [ index <= 0]
  350.     ifFalse: [ index <= queue next]
  351.  
  352.  
  353.  
  354. Figure 6: 
  355.  
  356. a_point=Point.x_y_(12,34);
  357. a_point.y_point;
  358. 34
  359.  
  360.  
  361. Class method
  362. x_y_(12,34)
  363.  
  364.  
  365. Point
  366. x   12
  367. y   34
  368. Instance of a Point object
  369.  
  370.  
  371.  
  372. Figure 7: 
  373.  
  374.  
  375. class Point 
  376. {
  377. /* instance variables */
  378. var x; /* x coordinate */
  379. var y; /* y coordinate */
  380. /* class methods */
  381. class method (r) x_y_ (a_x, a_y)
  382. {
  383. /*  create an object of class Point and set x=a_x and y=a_y */
  384.     r = create;
  385.     r.setXY(a_x,a_y);
  386. }
  387. /* instance methods */
  388. private setXY (x_coordinate, y_coordinate)
  389. {
  390.     x = x_coordinate;
  391.     y = y_coordinate;
  392. }
  393. method (r) x
  394. {
  395.     r = x;
  396. }
  397. method (r) x (value)
  398. {
  399.     x = value;
  400.     r = self;
  401. }
  402. method (r) y
  403. {
  404.     r = y;
  405. }
  406. method (r) y (value)
  407. {
  408.     y = value;
  409.     r = self;
  410. }
  411.  
  412.  
  413.  
  414.